home *** CD-ROM | disk | FTP | other *** search
/ IRIX 6.2 / IRIX 6.2 CD2.iso / dist / print.idb / usr / sbin / mkserialpr.z / mkserialpr
Text File  |  1996-06-10  |  10KB  |  473 lines

  1. #!/bin/sh
  2. #Tag 0x00000700
  3. #**************************************************************************
  4. #*
  5. #*           Copyright (c) 1993 Silicon Graphics, Inc.
  6. #*            All Rights Reserved
  7. #*
  8. #*       THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF SGI
  9. #*
  10. #* The copyright notice above does not evidence any actual of intended
  11. #* publication of such source code, and is an unpublished work by Silicon
  12. #* Graphics, Inc. This material contains CONFIDENTIAL INFORMATION that is
  13. #* the property of Silicon Graphics, Inc. Any use, duplication or
  14. #* disclosure not specifically authorized by Silicon Graphics is strictly
  15. #* prohibited.
  16. #*
  17. #* RESTRICTED RIGHTS LEGEND:
  18. #*
  19. #* Use, duplication or disclosure by the Government is subject to
  20. #* restrictions as set forth in subdivision (c)(1)(ii) of the Rights in
  21. #* Technical Data and Computer Software clause at DFARS 52.227-7013,
  22. #* and/or in similar or successor clauses in the FAR, DOD or NASA FAR
  23. #* Supplement. Unpublished - rights reserved under the Copyright Laws of
  24. #* the United States. Contractor is SILICON GRAPHICS, INC., 2011 N.
  25. #* Shoreline Blvd., Mountain View, CA 94039-7311
  26. #**************************************************************************
  27. #*
  28. #* File: mkserialpr
  29. #*
  30. #* $Revision: 1.5 $
  31. #*
  32. #* Description: Shell script for adding a serial interface printer to
  33. #*    the System V spooling system.
  34. #*
  35. #*    Usage: mkserialpr
  36. #*
  37. #*    Selection of all installation parameters such as printer name
  38. #*    will be done interactively.
  39. #*
  40. #**************************************************************************
  41.  
  42.  
  43. # Well known directories and programs
  44.  
  45. LPUTIL_DIR=/usr/lib
  46. LPUTIL=$LPUTIL_DIR/lputil
  47. AWK_DIR=/usr/bin
  48. AWK=$AWK_DIR/nawk
  49. OUT_FILT="/usr/bin/pg -s -p more... -e"
  50. SPOOL_DIR=/var/spool/lp
  51. LPSTAT=/usr/bin/lpstat
  52.  
  53.  
  54. # Global variables
  55.  
  56. PNAME=""
  57. DEF_SER_PORT=2
  58. SER_PORT=""
  59. SW_HAND="1"
  60. HW_HAND="2"
  61. DEF_HAND=$SW_HAND
  62. HANDSHAKE=""
  63. BAUD=""
  64. DEF_BAUD="9600"
  65. SW_HAND_PARAMS=""
  66. SER_DEV=""
  67. NUM_MODELS=0
  68. PMODEL_LIST=""
  69. PTYPE_LIST=""
  70. POPT_LIST=""
  71. TYPE_ID=""
  72. TYPE_NAME=""
  73. MODEL_NAME=""
  74. OPTION_STR=""
  75.  
  76.  
  77. #
  78. # Checks that we are the super-user and verifies
  79. # that the System V spooling system is present
  80. #
  81. CheckPermSpooler()
  82. {
  83.     cid=`/usr/bin/id | $AWK '{print substr($1,index($1,"("))}'`;
  84.     if [ "$cid" != "(root)" ]; then
  85.         echo "You must be logged in as root to use this program."
  86.         exit 1;
  87.     fi
  88.     if [ ! -r $SPOOL_DIR ]; then
  89.         echo "The System V spooling system is not installed on this system."
  90.         exit 1
  91.     fi
  92. }
  93.  
  94.  
  95. #
  96. # Creates a list of serial printers. The list consists of model
  97. # file name, printer type and other information
  98. #
  99. CreateSerList()
  100. {
  101.     list=`$LPUTIL list | $AWK -F\% 'BEGIN { dosep = 0 }
  102.     {
  103.         if ($3 != "" && (length($2) == 0 || index($2, "SERIAL"))) {
  104.         if (dosep)
  105.             printf("|")
  106.         else
  107.             dosep = 1
  108.         if (NF > 3)
  109.             printf("%s%%%s%%%s", $1, $3, $4)
  110.         else
  111.             printf("%s%%%s%%", $1, $3)
  112.         }
  113.     }'`
  114.     PMODEL_LIST=`echo $list | $AWK -F\% 'BEGIN { RS = "|"; dosep = 0 }
  115.     {
  116.         if (dosep)
  117.         printf(" ")
  118.         else
  119.         dosep = 1
  120.         printf("%s", $1)
  121.     }'`
  122.     PTYPE_LIST=`echo $list | $AWK -F\% 'BEGIN { RS = "|"; dosep = 0 }
  123.     {
  124.         if (dosep)
  125.         printf("|")
  126.         else
  127.         dosep = 1
  128.         printf("%s", $2)
  129.     }'`
  130.     POPT_LIST=`echo $list | $AWK -F\% 'BEGIN { RS = "|"; dosep = 0 }
  131.     {
  132.         if (dosep)
  133.         printf("|")
  134.         else
  135.         dosep = 1
  136.         printf("%s", $3)
  137.     }'`
  138.     NUM_MODELS=`echo $list | $AWK -F\% 'BEGIN { RS = "|"; count = 0 }
  139.     {
  140.         if ($1 != "")
  141.         count++
  142.     }
  143.     END { printf("%d\n", count) }'`
  144. }
  145.  
  146.  
  147. #
  148. # Displays a list of serial printers
  149. #
  150. ShowSerList()
  151. {
  152.     echo "Supported Serial Printer Types:"
  153.     echo $PTYPE_LIST | $AWK -F\| 'BEGIN { RS = "|" }
  154.     {
  155.         printf("\t%2d. %s\n", NR, $1)
  156.     }' | $OUT_FILT
  157. }
  158.  
  159.  
  160. #
  161. # Extracts the model file name from the model file list
  162. # given $1 is the index into the list
  163. #
  164. GetModelFileName()
  165. {
  166.     MODEL_NAME=`echo $PMODEL_LIST | $AWK '{
  167.             printf("%s\n",$i)
  168.         }' i=$1`
  169. }
  170.  
  171.  
  172. #
  173. # Extracts the printer type from the type list
  174. # given $1 is the index into the list
  175. #
  176. GetPrinterType()
  177. {
  178.     TYPE_NAME=`echo $PTYPE_LIST | $AWK -F\| '{
  179.             printf("%s\n",$i)
  180.         }' i=$1`
  181. }
  182.  
  183.  
  184. #
  185. # Extracts the printer model file options string
  186. # from the list given $1 is the index into the list
  187. #
  188. GetPrinterOptions()
  189. {
  190.     OPTION_STR=`echo $POPT_LIST | $AWK -F\| '{
  191.             printf("%s\n",$i)
  192.         }' i=$1`
  193. }
  194.  
  195.  
  196. #
  197. # Test for pure decimal positive integer input
  198. #
  199. # Expects $1 to be the value to check. Returns 0 if
  200. # OK, 1 if invalid positive integer or if more than one
  201. # argument specified
  202. #
  203. VerifyInt()
  204. {
  205.     if [ $# -eq 0 ]; then
  206.     return 0
  207.     fi
  208.     if [ $# -gt 1 ]; then
  209.     return 1
  210.     fi
  211.     echo $1 | egrep -s '^[0-9]*$'
  212.     return $?
  213. }
  214.  
  215.  
  216. #
  217. # Test for a valid printer name (i.e. 14 chars max, A-Za-z0-9_
  218. # only and no spaces)
  219. #
  220. VerifyPname()
  221. {
  222.     if [ $# -gt 1 ]; then
  223.         return 1
  224.     fi
  225.     echo $1 | egrep -s '^[A-Za-z0-9_]*$'
  226.     if [ $? -eq 1 ]; then
  227.         return 1
  228.     fi
  229.     if [ `echo $1 | $AWK '{ print length($1) }'` -gt 14 ]; then
  230.         return 1
  231.     else
  232.         return 0
  233.     fi
  234. }
  235.  
  236.  
  237. #########################################################################
  238. #
  239. # Main program
  240. #
  241.  
  242. #
  243. # Ensure that we are root and that the main System V
  244. # spooling system directory is present
  245. #
  246. CheckPermSpooler
  247.  
  248. #
  249. # Display an intro message
  250. #
  251. echo "Serial Printer Installation Tool\n"
  252.  
  253. #
  254. # Query user for a name for this printer
  255. #
  256. while [ "$PNAME" = "" ]; do
  257.     echo "Enter new printer name (14 chars max.): \c"
  258.     read PNAME
  259.     VerifyPname $PNAME
  260.     if [ $? -eq 1 ]; then
  261.     echo "Invalid response: Name must be 14 chars max. (A-Za-z0-9_ only)"
  262.     PNAME=""
  263.     fi
  264.     if [ "$PNAME" = "" ]; then
  265.     continue
  266.     fi
  267.     /bin/ls $SPOOL_DIR/member/$PNAME 2> /dev/null 1> /dev/null
  268.     if [ $? -eq 0 ]; then
  269.     echo ""
  270.     echo "WARNING: Printer $PNAME already exists."
  271.     echo '\nChoose a new name (y/n)[y]? \c'
  272.     read yn
  273.     if [ \( "$yn" != "n" \) -a \( "$yn" != "N" \) ]; then
  274.         PNAME=""
  275.     fi
  276.     fi
  277. done
  278. echo " "
  279.  
  280. #
  281. # Query the user for the device port number
  282. #
  283. while [ "$SER_PORT" = "" ]; do
  284.     echo "Enter serial port number [$DEF_SER_PORT]: \c"
  285.     read SER_PORT
  286.     if [ "$SER_PORT" = "" ]; then
  287.     SER_PORT=$DEF_SER_PORT
  288.     else
  289.         VerifyInt $SER_PORT
  290.         if [ $? -eq 1 ]; then
  291.             echo "Invalid response: Serial port must be a number"
  292.         SER_PORT=""
  293.         fi
  294.     fi
  295. done
  296. echo " "
  297.  
  298. #
  299. # Query the user for the handshaking method
  300. #
  301. echo "Handshaking method:"
  302. echo "\t1. Software"
  303. echo "\t2. Hardware"
  304. while [ "$HANDSHAKE" = "" ]; do
  305.     echo "Enter handshaking method number [$DEF_HAND]: \c"
  306.     read HANDSHAKE
  307.     if [ "$HANDSHAKE" = "" ]; then
  308.     HANDSHAKE=$DEF_HAND
  309.     else
  310.         VerifyInt $HANDSHAKE
  311.         if [ $? -eq 1 ]; then
  312.             echo "Invalid response: must be 1 or 2"
  313.             HANDSHAKE=""
  314.         continue
  315.         fi
  316.         if [ \( $HANDSHAKE -lt 1 \) -o \( $HANDSHAKE -gt 2 \) ]; then
  317.             echo "Invalid response: must be 1 or 2"
  318.             HANDSHAKE=""
  319.         fi
  320.     fi
  321. done
  322. echo " "
  323.  
  324. #
  325. # Query the user for the baud rate
  326. #
  327. echo "Available baud rates: 38400, 19200, 9600, 4800, 2400, 1200, 300"
  328. while [ "$BAUD" = "" ]; do
  329.     echo "Enter baud rate [$DEF_BAUD]: \c"
  330.     read BAUD
  331.     if [ "$BAUD" = "" ]; then
  332.         BAUD=$DEF_BAUD 
  333.     else
  334.         VerifyInt $BAUD
  335.         if [ $? -eq 1 ]; then
  336.             echo "Invalid response: Invalid baud rate"
  337.         BAUD=""
  338.         continue
  339.         fi
  340.         if [ $BAUD -eq 0 ]; then
  341.             echo "Invalid response: Baud rate must be greater than 0"
  342.         BAUD=""
  343.         fi
  344.     fi
  345. done
  346. echo " "
  347.  
  348. #
  349. # Form the serial port device file pathname
  350. #
  351. if [ $HANDSHAKE -eq $SW_HAND ]; then
  352.     SER_DEV="/dev/ttyd$SER_PORT"
  353.     SW_HAND_PARAMS="STTYPARAMS='\"-ixany ixon ixoff\"'"
  354. else
  355.     SER_DEV="/dev/ttyf$SER_PORT"
  356. fi
  357.  
  358. #
  359. # Sanity check the device port by seeing if we can ls it
  360. #
  361. /bin/ls $SER_DEV 2> /dev/null 1> /dev/null
  362. if [ $? -ne 0 ]; then
  363.     echo "WARNING: Device file $SER_DEV does not exist."
  364.     echo '\nContinue installation (y/n)[n]? \c'
  365.     read yn
  366.     if [ \( "$yn" != "y" \) -a \( "$yn" != "Y" \) ]; then
  367.     exit 1
  368.     fi
  369.     echo " "
  370. fi
  371.  
  372. #
  373. # Check to see if another printer is using this port
  374. #
  375. in_use=`cd $SPOOL_DIR/member; egrep -l $SER_DEV * 2> /dev/null`
  376. if [ "$in_use" != "" ]; then
  377.     echo "WARNING: Device file $SER_DEV is currently used by printer(s):"
  378.     for p in $in_use; do
  379.     echo "\t\t$p"
  380.     done
  381.     echo '\nContinue installation (y/n)[n]? \c'
  382.     read yn
  383.     if [ \( "$yn" != "y" \) -a \( "$yn" != "Y" \) ]; then
  384.     exit 1
  385.     fi
  386.     echo " "
  387. fi
  388.  
  389. #
  390. # Look for supported serial printer types and display what
  391. # we find
  392. #
  393. echo "Determining supported serial printer types..."
  394. echo " "
  395. CreateSerList
  396. if [ $NUM_MODELS -eq 0 ]; then
  397.     echo "ERROR: No serial printers appear to be supported on this system."
  398.     echo "       Check that printer software has been installed."
  399.     exit 1
  400. else
  401.     ShowSerList
  402. fi
  403. echo " "
  404.  
  405. #
  406. # Query user for printer type to install
  407. #
  408. while [ "$TYPE_ID" = "" ]; do
  409.     echo "Enter printer type number: \c"
  410.     read TYPE_ID
  411.     VerifyInt $TYPE_ID
  412.     if [ $? -eq 1 ]; then
  413.         echo "Invalid response: Type must be number between 1 and $NUM_MODELS"
  414.         TYPE_ID=""
  415.     fi
  416.     if [ "$TYPE_ID" = "" ]; then
  417.     continue
  418.     fi
  419.     if [ \( $TYPE_ID -eq 0 \) -o \( $TYPE_ID -gt $NUM_MODELS \) ]; then
  420.         echo "Invalid response: Type must be between 1 and $NUM_MODELS"
  421.         TYPE_ID=""
  422.     fi
  423. done
  424.  
  425.  
  426. #
  427. # Inform the user of what comes next
  428. #
  429. echo " "
  430. echo "Installing serial printer $PNAME..."
  431. echo " "
  432.  
  433. #
  434. # Given the type ID we can extract the model file name from the
  435. # model list, the type from the type list and the options from the
  436. # options list
  437. #
  438. GetModelFileName $TYPE_ID
  439. GetPrinterType $TYPE_ID
  440. GetPrinterOptions $TYPE_ID
  441.  
  442. #
  443. # Install the printer. We use awk to execute the lputil command
  444. # because we want the OPTION_STR strings handled properly (i.e.
  445. # with the proper quoting).
  446. #
  447. echo $LPUTIL add $SER_DEV $MODEL_NAME \
  448.     $PNAME NAME=\'\"$TYPE_NAME\"\' \
  449.     BAUDRATE=$BAUD $SW_HAND_PARAMS $OPTION_STR | $AWK '{
  450.         rv = system($0)
  451.         exit rv
  452.     }'
  453. if [ $? -ne 0 ]; then
  454.     echo "ERROR: Installation of new printer failed."
  455.     echo "       $LPUTIL command failed."
  456.     exit 1
  457. fi
  458.  
  459. #
  460. # Inform the user of what has happened
  461. #
  462. echo " "
  463. echo "Serial printer $PNAME has been installed"
  464. echo " "
  465. echo "Here is your printing environment:"
  466. echo " "
  467. $LPSTAT -t | $OUT_FILT
  468.  
  469. #
  470. # Return a successful exit code
  471. #
  472. exit 0
  473.